//#include<iostream>
//#include<algorithm>
//using namespace std;
//int value[101];
//bool flag[101];
//int ans=0;
//int m,n;
//void se(int m){
//	if(m==0){
//		ans++;
//		for(int i=0;i<n;i++){
//			cout<<flag[i]<<' ';
//		}
//		cout<<endl;
//		return;
//	}
//	for(int i=n-1;i>=0;i--){
//			if(!flag[i]&&m>=value[i]){
//				flag[i]=true;
//				se(m-value[i]);
//				flag[i]=false;
//			}
//	}
//}
//int main(){
//	cin>>n>>m;
//	for(int i=0;i<n;i++)
//		cin>>value[i];
//	sort(value,value+n);
//	se(m);
//	cout<<ans;
//}



//#include<iostream>
//using namespace std;
//int value[101];
//long long int ans=0;
//int m,n;
//void se(int m,int ii){
//	if(m==0){
//		ans++;
//		return;
//	}
//	for(int i=ii+1;i<n;i++){
//		cout<<ans<<endl;
//			if(m>=value[i]){
//				se(m-value[i],i);
//			}
//	}
//}
//int main(){
//	cin>>n>>m;
//	for(int i=0;i<n;i++)
//		cin>>value[i];
//	cout<<"over"<<endl;
//	se(m,-1);
//	cout<<ans;
//}

//#include <bits/stdc++.h>
//using namespace std;
//typedef long long LL;
//LL f[105][10005],n,m,v[105],ans;
//LL dfs(LL c,LL k)
//{
//    if(f[c][k])return f[c][k];
//    if(v[c]>k)return 0;
//    if(v[c]==k)ans++;
//    for(LL i=c+1;i<=n;i++)f[c][k]+=dfs(i,k-v[c]);
//    return f[c][k];
//}
//int main()
//{
//    scanf("%lld%lld",&n,&m);
//    for(LL i=1;i<=n;i++)scanf("%lld",&v[i]);
//    for(LL i=1;i<=n;i++)ans+=dfs(i,m);
//    printf("%lld\n",ans);
//    return 0;
//}




#include<iostream>
using namespace std;
int me[1000][1000]={0};
int value[101];
int m,n,ans;
int se(int m,int ii){
	if(me[m][ii]!=0){
		return me[m][ii];
	}
	if(m==0){
		return 1;
	}
	else{
		for(int i=ii+1;i<n;i++){
			if(m>=value[i])
				me[m][ii]+=se(m-value[i],i);
		}
		return me[m][ii];
	}
}
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++)
		cin>>value[i];
	for(int i=0;i<n;i++){
		if(m>=value[i])
			ans+=se(m-value[i],i);
	}
	cout<<ans;
}
